package com.adisi.bd;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.adisi.objetos.Perfil;
import com.adisi.objetos.Proceso;
import com.adisi.objetos.Usuario;

public class PerfilDatos {

	/**
	 * Obtiene una lista de todas los perfiles cargados en el sistema
	 * 
	 * @return List<Perfil>
	 */
	public List<Perfil> conseguirTodosLosPerfiles() {
		List<Perfil> listado = new ArrayList<Perfil>();
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Perfil_Select_All}");
			
			sp.execute();
			
			rs = sp.getResultSet();
			
			while (rs.next()) {
				
			Perfil perfil = new Perfil(
						rs.getInt("id_perfil"), 
						rs.getString("nombre"),
						rs.getString("detalle"));				

				listado.add(perfil);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return listado;
	}

	/**
	 * Obtiene una lista de todas los perfiles cargados a un usuario
	 * 
	 * @param int
	 * 
	 * @return List<Perfil>
	 */
	public List<Perfil> conseguirTodosLosPerfiles(int idUsuario) {
		List<Perfil> listado = new ArrayList<Perfil>();
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		ProcesoDatos prd = new ProcesoDatos();
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Perfil_Select_x_Usuario(?)}");
			sp.setInt("id_usuario", idUsuario);
			sp.execute();
			
			rs = sp.getResultSet();
			
			while (rs.next()) {
				
			Perfil perfil = new Perfil(
						rs.getInt("id_perfil"), 
						rs.getString("nombre"),
						rs.getString("detalle"));	
			
					perfil.setProcesos(prd.conseguirTodosLosProcesos(perfil.getIdPerfil()));

				listado.add(perfil);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return listado;
	}

	
	
	/**
	 * Obtiene los datos de 1 Tipo de Documento
	 * 
	 * @param int
	 * 
	 * @return Perfil
	 */
	public Perfil conseguirUnPerfil(int idPerfil) {
		
		Perfil perfil = null;
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Perfil_Select_x_Id(?)}");
			sp.setInt(1, idPerfil);
			sp.execute();
			
			rs = sp.getResultSet();
			while (rs.next()) {
					perfil = new Perfil(
						rs.getInt("id_perfil"), 
						rs.getString("nombre"),
						rs.getString("detalle"));

			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return perfil;
	}
	
	/**
	 * GRaba un Perfil en la Base de Datos
	 * 
	 * @param Perfil
	 * 
	 * @return Boolean
	 */
	public boolean grabarUnPerfl(Perfil perfil) {
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;

		/*
		@id_tipo_documento as int = null,
		@nombre as varchar(50) = null,
		@detalle
		 */
		
		
		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Perfil_Update(?,?,?)}");
			
			sp.setInt("id_perfil", perfil.getIdPerfil());
			sp.setString("nombre", perfil.getNombrePerfil());
			sp.setString("detalle", perfil.getDetallePerfil());
			
			sp.execute();  
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ok = true;
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}

	/**
	 * Elimina un Perfil en la Base de Datos
	 * 
	 * @param int
	 * 
	 * @return Boolean
	 */	
	public boolean borrarUnPerfil(int idPerfil) {

		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;

		/*
		 	@id_tipo_documento as int = null
			
		 */
		
		
		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Perfil_Delete(?)}");
			
			sp.setInt("id_perfil", idPerfil);
			
			sp.execute();  
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ok = true;
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}

	/**
	 * Agrega un Perfil a la Base de Datos
	 * 
	 * @param Perfil
	 * 
	 * @return Boolean
	 */	
	public boolean agregarUnPerfil(Perfil perfil) {
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;

		/*

		@nombre as varchar(50) = null,
		@detalle
		 */
		
		
		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Perfil_Insert(?,?)}");
			
			sp.setString("nombre", perfil.getNombrePerfil());
			sp.setString("detalle", perfil.getDetallePerfil());
			
			sp.execute();  
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ok = true;
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}	
	
	/**
	 * Borra los usuarios de 1 perfil
	 * 
	 * @param int
	 * 
	 * @return boolean
	 */
	public boolean limpiarUsuarios(int idPerfil) {
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;


		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Usuario_Perfil_Delete_All_x_Perfil(?)}");
			
			sp.setInt("id_perfil", idPerfil);
			
			sp.execute();  
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}


	/**
	 * Borra los procesos de 1 perfil
	 * 
	 * @param int
	 * 
	 * @return boolean
	 */
	public boolean limpiarProcesos(int idPerfil) {
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;


		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Perfil_Proceso_Delete_All_x_Perfil(?)}");
			
			sp.setInt("id_perfil", idPerfil);
			
			sp.execute();  
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}

	
	public boolean asignarUnUsuario(Perfil perfil, Usuario usuario) {
		
		return asignarUnUsuario(perfil, usuario.getIdUsuario());
	}

	public boolean asignarUnUsuario(Perfil perfil, Integer idUsuario) {
		// TODO Auto-generated method stub
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;
		
		int idPerfil = perfil.getIdPerfil();

		/*
@id_usuario as int = null,
@id_perfil as int = null
		 */
		
		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Usuario_Perfil_Insert(?,?)}");
			
			sp.setInt("id_usuario", idUsuario);
			sp.setInt("id_perfil", idPerfil);
			
			sp.execute();  
						
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ok = true;
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}	
		

	public boolean asignarUnProceso(Perfil perfil, Proceso proceso) {
		
		return asignarUnProceso(perfil, proceso.getIdProceso());
	}

	public boolean asignarUnProceso(Perfil perfil, Integer procesoId) {
		// TODO Auto-generated method stub
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;

		/*
@id_usuario as int = null,
@id_perfil as int = null
		 */
		
		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Perfil_Proceso_Insert(?,?)}");
			
			sp.setInt("id_perfil", perfil.getIdPerfil());
			sp.setInt("id_proceso", procesoId);
			
			sp.execute();  
						
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ok = true;
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}	
		
	
}
